#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e6 + 10;
int n,m;
vector<int> adj[maxn];
int ind[maxn]; // 入度
int dp[maxn]; // dp[i] 表示 i 到任意一个点的距离

void topo(){
	queue<int> q; // 队列
	for(int i=1;i<=n;i++){ // 将所有入度为 0 的点加入
		if(ind[i]==0){
			q.push(i); 
		}
	}
	
	while(!q.empty()){
		int from=q.front(); q.pop();
		for(const int & to:adj[from]){
			dp[to]=max(dp[to], dp[from]+1);
			ind[to]--;
			if(ind[to]==0){
				q.push(to);
			}
		}
	}
}


void solve(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		ind[v]++; // 入度增加
		adj[u].push_back(v);
	}
	
	topo(); // 拓扑排序
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans, dp[i]);
	}
	cout<<ans<<'\n';
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
